home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 March
/
EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso
/
earcd
/
assembler
/
progasm1.lha
/
SORGENTI2
/
LEZIONE6p.s
< prev
next >
Wrap
Text File
|
1994-07-28
|
7KB
|
224 lines
; Lezione6p.s STAMPIAMO LO SCHERMO UN CARATTERE OGNI FOTOGRAMMA
SECTION CiriCop,CODE
Inizio:
move.l 4.w,a6 ; Execbase
jsr -$78(a6) ; Disable
lea GfxName(PC),a1 ; Nome lib
jsr -$198(a6) ; OpenLibrary
move.l d0,GfxBase
move.l d0,a6
move.l $26(a6),OldCop ; salviamo la vecchia COP
; PUNTIAMO IL NOSTRO BITPLANE
MOVE.L #BITPLANE,d0
LEA BPLPOINTERS,A1
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
move.l #COPPERLIST,$dff080 ; Puntiamo la nostra COP
move.w d0,$dff088 ; Facciamo partire la COP
move.w #0,$dff1fc ; Disattiva l'AGA
move.w #$c00,$dff106 ; Disattiva l'AGA
mouse:
cmpi.b #$ff,$dff006 ; Linea 255?
bne.s mouse
bsr.s PrintCarattere ; Stampa un carattere alla volta
Aspetta:
cmpi.b #$ff,$dff006 ; linea 255?
beq.s Aspetta
btst #6,$bfe001 ; mouse premuto?
bne.s mouse
move.l OldCop(PC),$dff080 ; Puntiamo la cop di sistema
move.w d0,$dff088 ; facciamo partire la vecchia cop
move.l 4.w,a6
jsr -$7e(a6) ; Enable
move.l gfxbase(PC),a1
jsr -$19e(a6) ; Closelibrary
rts
; Dati
GfxName:
dc.b "graphics.library",0,0
GfxBase:
dc.l 0
OldCop:
dc.l 0
; Questa routine e' una specie di ibrido tra la routine normale del
; PRINT e quella della TABELLA, infatti utiliziamo il TESTO in maniera
; analoga ad una tabella, prendendone un valore solamente ogni FOTOGRAMMA
; e stampandolo. D'altronde dobbiamo salvare anche l'indirizzo nel
; bitplane dell'ultima posizione raggiunta nel print, per stampare il
; carattere seguente dopo quello precedente. Per mantenere tra un frame
; e l'altro l'indirizzo del carattere nel testo e del punto del bitplane
; dove siamo arrivati sono usate 2 longword PUNTATORI:
;
; PuntaTesto:
; dc.l TESTO
;
; PuntaBitplane:
; dc.l BITPLANE
;
; Ogni volta che la routine viene eseguita viene stampato un solo
; carattere e viene aggiornato sia il puntatore del TESTO, con un
; ADDQ.L #1 che lo sposta al carattere dopo (essendo un carattere
; lungo un byte), sia il puntatore del BITPLANE, infatti ogni carattere
; ha il suo posto nel bitplane.
; Il primo problema e' che ogni 40 caratteri bisogna "ANDARE A CAPO",
; ossia aggiungere 40*7 al puntatore del BITPLANE. Per risolvere questo
; e' bastato aggiungere uno ZERO alla fine di ogni riga di testo e
; delle istruzioni che controllano se il byte da stampare e' zero: se
; si tratta dello zero allora significa che siamo alla fine della riga,
; dunque viene aggiunto 40*7 al puntatore bitplane ed 1 a quello testo
; per saltare lo zero e puntare al primo carattere della riga dopo.
; Il secondo problema e' che una volta raggiunta la fine del testo
; bisogna smettere di stampare caratteri. Per convenzione terminando
; la riga con $FF anziche' con $00 indichiamo la fine del testo, basta
; controllare se il byte da leggere e' $FF e uscire senza stampare e
; senza far avanzare il puntatore PUNTATESTO, per cui ogni volta che
; viene eseguito PRINTcarattere dopo aver stampato l'intero testo usciamo
; senza compiere operazioni, in quanto il carattere e' sempre $FF.
; NOTA: potete "inventare" vari numeri "speciali" da inserire nel
; testo per varie funzioni, basta che non siano numeri compresi tra $20
; e $80, ossia tra i byte dedicati ai caratteri.
PRINTcarattere:
MOVE.L PuntaTESTO(PC),A0 ; Indirizzo del testo da stampare in a0
MOVEQ #0,D2 ; Pulisci d2
MOVE.B (A0)+,D2 ; Prossimo carattere in d2
CMP.B #$ff,d2 ; Segnale di fine testo? ($FF)
beq.s FineTesto ; Se si, esci senza stampare
TST.B d2 ; Segnale di fine riga? ($00)
bne.s NonFineRiga ; Se no, non andare a capo
ADD.L #40*7,PuntaBITPLANE ; ANDIAMO A CAPO
ADDQ.L #1,PuntaTesto ; primo carattere riga dopo
; (saltiamo lo ZERO)
move.b (a0)+,d2 ; primo carattere della riga dopo
; (saltiamo lo ZERO)
NonFineRiga:
SUB.B #$20,D2 ; TOGLI 32 AL VALORE ASCII DEL CARATTERE, IN
; MODO DA TRASFORMARE, AD ESEMPIO, QUELLO
; DELLO SPAZIO (che e' $20), in $00, quello
; DELL'ASTERISCO ($21), in $01...
MULU.W #8,D2 ; MOLTIPLICA PER 8 IL NUMERO PRECEDENTE,
; essendo i caratteri alti 8 pixel
MOVE.L D2,A2
ADD.L #FONT,A2 ; TROVA IL CARATTERE DESIDERATO NEL FONT...
MOVE.L PuntaBITPLANE(PC),A3 ; Indir. del bitplane destinazione in a3
; STAMPIAMO IL CARATTERE LINEA PER LINEA
MOVE.B (A2)+,(A3) ; stampa LA LINEA 1 del carattere
MOVE.B (A2)+,40(A3) ; stampa LA LINEA 2 " "
MOVE.B (A2)+,40*2(A3) ; stampa LA LINEA 3 " "
MOVE.B (A2)+,40*3(A3) ; stampa LA LINEA 4 " "
MOVE.B (A2)+,40*4(A3) ; stampa LA LINEA 5 " "
MOVE.B (A2)+,40*5(A3) ; stampa LA LINEA 6 " "
MOVE.B (A2)+,40*6(A3) ; stampa LA LINEA 7 " "
MOVE.B (A2)+,40*7(A3) ; stampa LA LINEA 8 " "
ADDQ.L #1,PuntaBitplane ; avanziamo di 8 bit (PROSSIMO CARATTERE)
ADDQ.L #1,PuntaTesto ; prossimo carattere da stampare
FineTesto:
RTS
PuntaTesto:
dc.l TESTO
PuntaBitplane:
dc.l BITPLANE
; $00 per "fine linea" - $FF per "fine testo"
; numero caratteri per linea: 40
TESTO: ; 1111111111222222222233333333334
dc.b ' PRIMA RIGA ',0 ; 1
dc.b ' SECONDA RIGA ',0 ; 2
dc.b ' /\ / ',0 ; 3
dc.b ' / \/ ',0 ; 4
dc.b ' ',0 ; 5
dc.b ' SESTA RIGA ',0 ; 6
dc.b ' ',0 ; 7
dc.b ' ',0 ; 8
dc.b 'FABIO CIUCCI COMMUNICATION INTERNATIONAL',0 ; 9
dc.b ' ',0 ; 10
dc.b ' 1234567890 !@#$%^&*()_+|\=-[]{} ',0 ; 11
dc.b ' ',0 ; 12
dc.b ' LA PALINGENETICA OBLITERAZIONE ',0 ; 15
dc.b ' ',0 ; 16
dc.b ' ',0 ; 17
dc.b ' Nel mezzo del cammin di nostra vita ',0 ; 18
dc.b ' ',0 ; 19
dc.b ' Mi RitRoVaI pEr UnA sELva oScuRa ',0 ; 20
dc.b ' ',0 ; 21
dc.b ' CHE LA DIRITTA VIA ERA SMARRITA ',0 ; 22
dc.b ' ',0 ; 23
dc.b ' AHI Quanto a DIR QUAL ERA... ',$FF ; 24 FINE
EVEN
SECTION GRAPHIC,DATA_C
COPPERLIST:
dc.w $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
dc.w $12a,0,$12c,0,$12e,0,$130,0,$132,0
dc.w $134,0,$136,0,$138,0,$13a,0,$13c,0
dc.w $13e,0
dc.w $8E,$2c81 ; DiwStrt
dc.w $90,$2cc1 ; DiwStop
dc.w $92,$0038 ; DdfStart
dc.w $94,$00d0 ; DdfStop
dc.w $102,0 ; BplCon1
dc.w $104,0 ; BplCon2
dc.w $108,0 ; Bpl1Mod
dc.w $10a,0 ; Bpl2Mod
; 5432109876543210
dc.w $100,%0001001000000000 ; 1 bitplane LOWRES 320x256
BPLPOINTERS:
dc.w $e0,0,$e2,0 ;primo bitplane
dc.w $0180,$000 ; color0 - SFONDO
dc.w $0182,$19a ; color1 - SCRITTE
dc.w $FFFF,$FFFE ; Fine della copperlist
; Il FONT caratteri 8x8
FONT:
incbin "metal.fnt"
; incbin "normal.fnt"
; incbin "nice.fnt"
SECTION MIOPLANE,BSS_C
BITPLANE:
ds.b 40*256 ; un bitplane lowres 320x256
end